为艺术而技术

Spring Cloud Alibaba

January 16, 2022

注: 如果想直接看代码,点击这里

完成升级到Jubilee后,我们继续向前,第一步是尝试使用Alibaba套件。主要是Nacos,用来来替换原先系统中的Registry Server和Config Server。

首先是加入依赖,注意老版本groupId是org.springframework.cloud,新版本已经叫com.alibaba.cloud,当然artifactIdspring-cloud-alibaba-dependencies没有变。不得不说,咱中国人现在越来越有发言权了,这个东西确实是中国人搞出来的,这个groupId改了也没毛病。唯一一个小问题就是在Spring所有子项目中显得有些不一样,毕竟NetFlix也贡献了不少,不过人家既然开源就接受了spring的收编,就接受了Spring的groupId,毕竟整个上层的抽象和架构都是Spring团队搞出来的,改groupId稍微有点小家子气。有些扯远了,回来。

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2021.1</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>

Registry

整个Registry项目都可以删除了,因为外部有个Nacos可以代劳了。

然后在所有子项目中增加:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

删除:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

配置方面

删除Eureka的配置

eureka:
  instance:
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://registry:8761/eureka/

增加部分:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

在我们已经用命令cmd startup.cmd -m standalone启动Nacos的前提下,启动就可以看见这个Service了。

Nacos

Config

自然是可以删除Config整个项目了,另外其他项目中关于Config的配置也需要了。

删除:

spring:
   cloud:
    config:
      uri: http://localhost:8889
      fail-fast: true
      password: ${ACCOUNT_SERVICE_PASSWORD}
      username: user

增加依赖:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

然后把部分配置就可以转移到Nacos中,只要保证DataId(后缀名可以是yaml或者properties)与此应用的名字(spring.application.name)匹配即可。

spring:
  application:
    name: account-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
  main:
    allow-bean-definition-overriding: true
    allow-circular-references: true 

值得注意的是,如果是保存为yml格式,需要增加file-extension配置。实际上,如果你配置了config address,就不需要配置discovery address,因为他们是一体的,没有必要重复。

DataId的原始含义: ${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

Profile

spring.profiles.active=DEV

Group

spring.cloud.nacos.config.group=DEV_GROUP

Namespace

spring.cloud.nacos.config.namespace=83eed625-d166-4619-b923-93df2088883a

统一配置

spring.cloud.nacos.config.ext-config[0].data-id=actuator.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=log.properties
spring.cloud.nacos.config.ext-config[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true

分享配置

spring.cloud.nacos.config.shared-dataids=actuator.properties,log.properties
spring.cloud.nacos.config.refreshable-dataids=actuator.properties,log.properties

shareids这种方式的优先级低于ext-config的方式,当然也低于普通的配置。

Sentinel

这个服务是用来做服务保障的,地位类似于过去的Hysrtrix,以及现在的resilence4j。但它是独立运行的,如果要整合,需要先增加依赖。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>

如果要用Nacos来持久化规则,加上下面的依赖

    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
        <version>1.8.3</version>
    </dependency>

配置里面增加一条

spring:
  cloud:
    sentinel: 
      transport:
        dashboard: localhost:8080

如果用到Nacos的情况下

spring:
  cloud:
    sentinel: 
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            dataId: account-service
            groupId: DEFAULT_GROUP
            rule-type: flow

当然Sentinel还支持@SentinelResource等更具体的用法,总体而言,还是比较直接的。明天开始弄Kubernates,据说比较复杂。


© 2019 - 2022 yuanqingfei
Creative Commons License